# coding=utf-8
import jwt
from jwt import PyJWTError
from datetime import datetime,timedelta
from comment.ultils import const
from flask import current_app
from comment.modules.user import User

def generate_tokens(uid):
    '''
    一个用户在一次会话中生产一个tokens
    :param uid:
    :return:
    '''
    params = {
        'id':uid, #把用户ID作为生成tokens的参数
        #utcnow()标准的北京时间，timedelta把秒转化成毫秒
        #他的意思是在标准时间的基础上，设置有效时间（例：下午2点+1个小时的有效时间，就是到下午3点失效）
        'exp': datetime.utcnow() + timedelta(seconds=const.JWT_EXPIRY_SECOND)     #exp代表tokens的有效时间（最后一次请求的时间，做起始时间）
    }
    #返回jwt.encode传3个参数：1.payload传的是根据什么样的参数生成tokens  2.key传的是密钥  3.algorithm传的是算法
    return jwt.encode(payload=params,key=const.SECRET_KEY,algorithm='HS256') #算法是：SHA-256（简写是HS256）
    #SHA-256：密码散列算法，他会产生256bit长的哈希值（32位字符的字符串）--->十六进制来表示，信息摘要，不可逆的

def verify_tokens(tokens_str):
    '''
    验证tokens，如果验证成功，则返回用户ID
    :param tokens_str:
    :return:
    '''
    try:
        #返回之前生产token的时候的字典
        data = jwt.decode(tokens_str,key=const.SECRET_KEY,algorithms='HS256')
        current_app.logger.info(data)
        user = User.query.filter(User.id == data['id']).first()
        if user and user.onlock == 0: #user.onlock当前用户是不是锁定的（当前用户有没有失效）（0是正常）
            return {'id':user.id}
        else:
            return {
                'message':'数据库中不存在当前用户，或者用户已经过期',
                'code': 205
            }
    except PyJWTError as e:
        current_app.logger.error(e)
        return {
            'message':'token验证失败',
            'code': 206
        }











